home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 March: Reference Library / Dev.CD Mar 97 RL.toast / mac / Technical Documentation / Macintosh Technical Notes / technotes / tn / tn_1075.cw < prev    next >
Encoding:
Text File  |  1997-01-10  |  44.1 KB  |  632 lines  |  [TEXT/ttxt]

  1. ˜BOBO{¥$HRLWLWLWüû}}dÿÿH}}`ÂBd
  2. ÿÿ}}tÿ-Z
  3.     ÿÿÿFrederique Courard Haurix HH 0ÿìÿï4Adxfihh 
  4. ›d'ÿ˛ÿ« Eÿÿ}¥`        ∫∞,‰/ÀDØP }}h~w˛3©3©}™•ØD•ÿÿ…}©p|†› }|À4°ÿÿÿÿÿÿÿÿ+    \DSETD    L,•-Ä
  5. èË}™8}}√}}}} €≠~wxEé€≠&uâ€≠+sÒ€≠%uã€≠(•ã€≠%x
  6. €≠%™"ì€≠&w(ü€≠}|‘Ï@}R≠‰√Éı≠ç¿è¿é¿É∂ÅÇÅçÅÉùÉQ…fÀfÚfÛfñfff9fXfYÜtÜvÜ∫Ü“ÜËÜÍÜÎfÏfâfäfûf        f     f    =f    Rf    Uf    ¡f    Ôf    Õf
  7. =f
  8. Jf
  9. ™f
  10. ∞f
  11. µf f f }f áf Ef Ff ¨f
  12.  
  13. f
  14. lf
  15. nf
  16. ~f
  17. •e
  18. ™
  19.  ÉÒ‡∞[∞]∞p∞≠∞≥∞∑∞å∞ç∞ú∞ ∞ÉÉc≈ÂèÂëÂÂÂ,Ɍɂ©fÂfÄfÓfàfãÊäÊÊ@ÃAÉüØGØbØ}Ø˝Ø’Ø»ØÔØòØóØØSØTØ√ØπØ
  20. ØØ_ØaØı؃ØìØîØflØÉ¨≈Ôàà$à&à3àXàoàqà—à˘à˝àÊàààöàùàÿàà'à)Ã*QÉû"ØØØHØ|Ø~ÿ˙É
  21. ÅÅ9Å^Åz⁄Éñ∫ÊEÊzʯÉ_{Éc∫—Ê»É!/Ê!CÉ!«Ê!áÊ!øÉ"eÃ"g"∞É"ì∫#Â#:Â#IÂ#dÂ#p#ŸÉ$ºÉ$»Ê$ØÊ$óÊ%    Ê%(Ê%3Ê%IÊ%hÊ%sÊ%≈Ê%¨Ê%“Ê%ÎÊ%†Å%fi¿%òÉ(ZÉ(œ∫(†Ê(üÊ)Ê)
  22. É)ËÉ*i∫*«Ø*ËØ*âØ+Ø+"é+*ë++ö+pö+ºö,ö,,ö,-ö,?ö,@ö,ºö,»ö-Ÿ-⁄o-ıÉ    ≥kà;à`Q
  23. ∑R
  24. qa
  25. à™q    nr
  26. q‰
  27. r
  28. s‹
  29. sÕ
  30. s
  31. sı
  32. qç0èÓ+0
  33. ≥∂w‚
  34. {ÇwÊ
  35. {çwê
  36. {
  37. ≥ùà4
  38. ≥Pà•Q
  39. tZ
  40. y≈    È…
  41. ÔÚ
  42. Ôñ
  43. Ô
  44. ÔX
  45. ÔY
  46. †v
  47. †“
  48. †Í
  49. †Î
  50. Ôâ
  51. Ôû
  52. Ô     
  53. Ô    R
  54. Ô    ¡
  55. Ô    Õ
  56. J
  57. ∞
  58. Ô 
  59. Ô }
  60. Ô E
  61. Ô ¨
  62. l
  63. ~
  64. •àÓ
  65. ™à4
  66.  
  67. ≥
  68. ù
  69. sΩ
  70. ÀÑ
  71. ≥Ò
  72. tÛ
  73. yü    È‡
  74. Áç
  75. Á
  76. ≥
  77. s`
  78. sb
  79. ≥c
  80. tl
  81. y√    È≈
  82. l
  83. làfià4,
  84. ≥‚
  85. t˝
  86. y¨    È©
  87. Ôã
  88. @    ÇA
  89. ≥±•
  90. Û“
  91. ≥´
  92. òã¶
  93. ≥ü
  94. t
  95. y    È
  96. ßò
  97. ß
  98. ß
  99. ≥^
  100. À~
  101. ≥‹äâ
  102. ≥¨    Ç¨
  103. ͱ
  104. ÒÓ    ÕÔ
  105. á—
  106. á
  107. á)àÌ*à4Q
  108. ≥ˇ
  109. s£ä’
  110. ≥úà•û
  111. t
  112. y!    È"    è|    è}
  113. ß~
  114. ÑÓ+˘0˙
  115. ≥
  116. w
  117. {w"
  118. {9w<
  119. {^wa
  120. {zà4⁄
  121. ≥ñ
  122. Ëú
  123. Π   Ï
  124. z
  125. ®
  126. àâ¯
  127. ≥_à4{
  128. ≥c
  129. Ël
  130. Î…    Ï—
  131. º    Æ»
  132. ≥ Ô
  133. À æ
  134. ≥!/
  135. !C
  136. ≥!«
  137. !÷    Æ!ø
  138. ≥"d    ≤"e Ù"f
  139. Ñ"g à‹"≠à4"∞
  140. ≥"ì
  141. Ë"õ
  142. Î#    Ï#
  143. l#I
  144. l#o
  145. å#p à‹#‘à4#Ÿ
  146. ≥$»
  147. %s
  148. %†
  149. {%fiÓ+%ñ0%ò
  150. ≥(œ
  151. Ë(°
  152. Î(Ü    Ï(†
  153. Ö) ç)
  154. 
  155. ≥*W
  156. s*g
  157. ≥*i
  158. Ë*s
  159. Î*ª    Ï*«
  160. æ*â
  161. æ+"Óê+*
  162. ì++
  163. j,-àø,? ó,B
  164. ÷,» ó,∏
  165. ÷-‘ ô-Ÿ
  166. J-⁄ àb-ˇ
  167. z-ı
  168. ≥≠’}~8’Ç}™ •fl}~°
  169. ~ô}}xr©}~¸}~Hÿ}|èÉ}z¸æº}|Ô ì}|€#‘ˇ}|‹&)Ñ}z¬)úË{¥h’
  170. T E C H N O T E : 
  171. Some Techniques for Handling Variables in Apple Guide 
  172.     
  173. By Don Swatman
  174. don@bilpin.co.uk
  175. Developer Technical Support (DTS)
  176.  
  177. Apple Guide has many advantages over other help systems but also has several drawbacks. One is that it is not easy to keep track of what the user has already done. This becomes a particular problem if you are writing a tutorial. For example, your tutorial might have 10 different lessons which the user may need to complete over several days. How can the user be sure that he or she has gone back to the point they left the tutorial and not skipped stages? One way to do this is to store variables within an application.
  178. This Technote also discusseÇs using helper applications with Apple Guide.
  179.  
  180. Storing Apple Guide Variables in an Application
  181. Storing the  variables within your application is often the easiest place to put them. You need to do several things:
  182. ¥     Create storage for the variables and initialize them
  183. ¥     Install Apple Event handlers
  184. ¥     Install custom context check handlers
  185. The examples below just store an array of longs and initialize everything to 0 each time the application is run. For simplicity sake, the codes only going to set them to 0 or 1 and test whether they are 0 or non 0. An unregistered suite of Apple Events 'Vals' is going to be used. This is for demonstration purposes only and you should use your own ID's. The Apple Guide accesses variables 1 to 3, however, as arrays in 'C' start from 0, indexes from the guide are mapped from 1-3 to 0-2.
  186. Installing and Initializing
  187. You need to create storage for variables and then initialize them. You may want to store and recall these fflrom a preference file or clear them each time the application is run.  Listing 1 contains storage for 3 variables and a context check reference. It also shows how to initializes them and install the handlers.
  188. Listing 1. Initializing the guide variables and handlers
  189. // Maximum number of values that can be stored by app
  190. #define kMaxAGEntries 3  
  191.  
  192. // Storage for values
  193. long gAGValues[kMaxAGEntries];
  194.  
  195. // Storage for context check references
  196. AGContextRefNum contextRefNum;
  197.  
  198. void ClearAllAGValues()            
  199. {
  200.     long    count;
  201.     for (count=0;count < kMaxAGEntries;count++)
  202.         gAGValues[count] = 0;
  203. }
  204.  
  205.  
  206. OSErr InitAGVars()
  207. {
  208.     OSErr theErr = noErr;
  209.     short count;
  210.     
  211. // Clear all the values stored by the application
  212.     ClearAllAGValues();
  213.         
  214. // Install context check handler. MyContextCallBack will get called when a 
  215. // context check of 'Vals' is queried by the Guide
  216.  
  217.     theErr = AGInstallContextHandler( NewContextReplyProc(MyContextCallBack), 'Vals', 0, &contextRefNum );
  218.     if (theErr)
  219.         DebugStr("\pGot an Err - AGInstallContextHandler "ô);
  220.     
  221. // set up the dispatch table for the Apple Events
  222.     theErr = AEInstallEventHandler( 'Vals', 'Cler', NewAEEventHandlerProc(ClearAGValues), 0, false) ;
  223.  
  224.     theErr = AEInstallEventHandler( 'Vals', 'Clr1', NewAEEventHandlerProc(ClearAGValues1), 0, false) ;
  225.     theErr = AEInstallEventHandler( 'Vals', 'Clr2', NewAEEventHandlerProc(ClearAGValues2), 0, false) ;
  226.     theErr = AEInstallEventHandler( 'Vals', 'Clr3', NewAEEventHandlerProc(ClearAGValues3), 0, false) ;
  227.  
  228.     theErr = AEInstallEventHandler( 'Vals', 'Set1', NewAEEventHandlerProc(SetAGValues1), 0, false) ;
  229.     theErr = AEInstallEventHandler( 'Vals', 'Set2', NewAEEventHandlerProc(SetAGValues2), 0, false) ;
  230.     theErr = AEInstallEventHandler( 'Vals', 'Set3', NewAEEventHandlerProc(SetAGValues3), 0, false) ;
  231.     
  232.     return theErr;
  233. }
  234.  
  235. Setting and Clearing Variables
  236. Setting and clearing of variables is done by Apple Events. Each event has a specific ID and no passed parameters. You will probably need to make these obvious by their ID. For instance, to set and clear value 1©, use the event ID's 'Set1' and 'Clr1' . The source for the handlers can be found in Listing 1.
  237. Listing 2. Setting and clearing a variable
  238. pascal OSErr SetAGValues1(const AppleEvent *message, const AppleEvent *reply, long refcon)            
  239. {
  240.     gAGValues[0] = 1;
  241.     return( noErr );
  242. }
  243.  
  244. pascal OSErr ClearAGValues1(const AppleEvent *message, const AppleEvent *reply, long refcon)            
  245. {
  246.     gAGValues[0] = 0;
  247.     return( noErr );
  248. }
  249.  
  250. For ease, you may want to clear all the variables. This is done by event ID 'Cler'.
  251. Listing 3. Clearing all the variables
  252. pascal OSErr ClearAGValues(const AppleEvent *message, const AppleEvent *reply, long refcon)            
  253.  {
  254.     ClearAllAGValues();
  255.     return( noErr );
  256. }
  257. Interrogating Variables
  258. Checking the state of the variables is handled by Apple Guide context checks. There are mechanisms to pass data from a guide file into a context check; therefore, you only need one check which can be used to interrogate all the values. In this case, two longs are passed in the pInputData parameter. The easiest way to access them is to create a structure.
  259.  
  260. Listing 3. Passed data
  261. struct PassedAGParamType
  262. {
  263.     long command;
  264.     long index;
  265. };
  266.  
  267. typedef struct PassedAGParamType PassedAGParamType,
  268.     *PassedAGParamPtr, **PassedAGParamHdl;
  269.  
  270. If command contains a 0, then a check is made to see if the value is 0. If it contains a 1, then the check sees it if the value is non-0. Index is used to define which variable to check.
  271. Listing 4. Context check
  272. pascal OSErr MyContextCallBack( Ptr   pInputData,
  273.                         Size  inputDataSize,
  274.                         Ptr   *ppOutputData,
  275.                         Size  *pOutputDataSize,
  276.                         AGAppInfoHdl hAppInfo )
  277. {
  278.     OSErr   theErr = noErr;
  279.     Boolean checkResult = false;
  280.  
  281. // Check the index is within range
  282.     if (((PÿassedAGParamPtr)pInputData)->index <= kMaxAGEntries)
  283.  
  284. // Work out whether we need to return true or false
  285.         if (((PassedAGParamPtr)pInputData)->command == 1)
  286.             checkResult = gAGValues[ ((PassedAGParamPtr)pInputData)->index - 1 ] != 0;
  287.         else
  288.             checkResult = gAGValues[ ((PassedAGParamPtr)pInputData)->index - 1 ] == 0;
  289.     
  290. // Set up the return values ppOutputData and pOutputDataSize
  291.  
  292.     theErr = MySetContextResult ( checkResult, ppOutputData, pOutputDataSize );
  293.     
  294.     return theErr;
  295. }
  296. Once the result of the check has been determined, MySetContextResult() is used to fill in the ppOutputData and pOutputDataSize. The result is returned in this way because it is part of a far wider mechanism. MySetContextResult creates a pointer and moves the value in result into to itÉ. Next, it returns the newly created pointer and the size of the data within it. Apple Guide is responsible for deallocating this pointer.
  297. Listing 5. Setting the context check result
  298. OSErr MySetContextResult( Boolean result, Ptr *outMessage,
  299.                     Size *outSize )
  300. {
  301.     Ptr   pOut;
  302.     Size  theSize = sizeof ( Boolean );
  303.     OSErr theErr = noErr;
  304.     
  305.     pOut = NewPtr (theSize);
  306.     if ( pOut )
  307.     {
  308.         BlockMove( (void *)&result, pOut, theSize );
  309.         *outSize = theSize;
  310.         *outMessage = pOut;
  311.     }
  312.     else
  313.         theErr = MemError();
  314.     return theErr;    
  315. }
  316.  
  317. Don't forget to clear up when you quit
  318. Before your application quits, you should remove the context check handlers using AGRemoveContextHandler. You also may want to save the variables into a preference file.
  319. Listing  6. Removing the context check
  320. void RemoveAGStuff()
  321. {
  322.     OSErr theErr;
  323.     theErr = AGRemoveContextHandler( &contextRefNum );
  324. }
  325.  
  326. Making Use of These Calls
  327. Once the necessary calls have been added to the application, it's time to makºe changes to the guide's source files.
  328. ¥     Define events 
  329. ¥     Define context checks 
  330. ¥     Mark sequences that are completed
  331. ¥     Skip completed sequences
  332. Defining the Events
  333. To make use of the events defined in the application, you need to define the events in the guide. 
  334. Listing 7. Defining the events
  335. <Define Event> "ClearValues", 'AgHp', 'Vals', 'Cler'
  336. <Define Event> "SetFlag1",    'AgHp', 'Vals', 'Set1'
  337. <Define Event> "ClearFlag1",  'AgHp', 'Vals', 'Clr1'
  338. ClearValues sends the Apple Event 'Cler' of event class 'Vals' to the application with the creator type 'AgHp'. This is defined in the application to clear all variables to 0.
  339. Defining the Context Checks
  340. As previously mentioned, context checks have a mechanism for passing data. They are defined in the additional parameters of the <DCC> command. In this case, if we want to check that a variable has been set,we would use the command:
  341. Listing 8. Defining the context checks.
  342. <DCC> "IsFlagSet", 'Vìals', 'AgHp', LONG:1, LONG
  343. 'Vals' is the context check in the application with the identifier 'AgHp'. The first additional parameter is a long with a default value of one. The second is a long which will need a value entered each time the check is used. These two parameters correspond to the data structure PassedAGParamType described above, therefore to check to see if variable one has been set:
  344. <If> (IsFlagSet(1))
  345. If  you want to be more specific, for example a check to see if lesson one has been completed could be:
  346. <DCC> "IsLesson1Done", 'Vals', 'AgHp', LONG:1, LONG:1
  347. <If> (IsLesson1Done())
  348. Note that because both parameters have defaults, you don't need to enter a parameter when the check is used.
  349.  
  350. Marking Sequences Completed
  351. To mark a sequence completed,  use an <On Panel Hide> command with a suitable event to set the variable.
  352. Listing 9. Marking a sequence complete
  353. <Define Panel> "Lesson 1 - last panel"
  354. Panel text....
  355. <On Panel Hide> SetFlag1()
  356. <End Panel>
  357. Skipping Completed Sequencesˇ
  358. To skip sequences, create a containing sequence that will take you through your tutorial. You'll probably want to put an intro and outro panel into the sequence. To decide whether to show a lesson sequence, use the <If> command as shown below. This will skip lessons that have already been completed.
  359.  
  360. <Define Sequence> "Tutorial"
  361.   <Panel> "Tutorial Intro"
  362.   <If> NOT Flag1Set()
  363.     <Jump Sequence> "Lesson 1"
  364.   <End If>
  365.   <If> NOT Flag2Set()
  366.     <Jump Sequence> "Lesson 2"
  367.   <End If>
  368.   <If> NOT Flag3Set()
  369.     <Jump Sequence> "Lesson 3"
  370.   <End If>
  371.   <Panel> "Tutorial Outro"
  372. <End Sequence>
  373.  
  374. Helper Applications
  375. It's not always possible for a guide author to have accÑess to the applications source, therefore it is not always possible to add the features described above to an application. Also, some applications use Apple Events but are not necessarily scripted. Setting up these events may be very difficult or impossible from Apple Guide. In these cases, it's possible to write a small background only application which can be used to store variables and from simple Apple Eventsm create and trigger far more sophisticated events. This small application could be used to store variables and handle the code described above.
  376. To trigger it, you need to add a compiled Apple Script to the application. 
  377. Listing 10. Apple Script to trigger helper application
  378. tell application "AGHelperApp"
  379.     launch
  380. end tell
  381. When you compile the script, make sure the helper application is in the same folder as the script. Also, if you change the creator type of the helper, you will need to recompile the script.
  382. You will probably need to start the helper fromË the first panel of the tutorial sequence. In the example below, the compiled script is called StartHelperApp.
  383. Listing 11. Starting the helper application from within the guide
  384. <Define Panel> "Tutorial Intro"
  385. Tutorial Intro text...
  386. <On Panel Create> DoAppleScript( "StartHelperApp" )
  387. <End Panel>
  388. Summary
  389.  
  390. Guide files and tutorials can seriously add to the usability of your
  391. product. Keeping track of how far the user has gone through your tutorial
  392. will help the user learn your product. The techniques in this Technote will
  393. help you to implement this. Use them!
  394.  
  395. Further Reference
  396.  
  397. ¥ Apple Guide Complete, published by Addison-Wesley, is an essential volume if you are writing Apple Guide help systems. 
  398.  
  399. ¥ AGVariable sample code is an example implementation using the techniques described in this Technote. It contains a 'C' file that can be added to your application however it based around a helper application.
  400.  
  401. Acknowledgments
  402. Special thanks to Jason Hodges-Harris.ZÿÿN€ÒDSET≠ÿÿ.HHÿÿÿÿÿÿ}}¬€°b¯0€ÿÿ6ÿÿ*b¯DSETΔÿÿ.H§/.ÿÿÿÿÿÿ}}ô¯≠€ÿÿ°2€ÿÿ`â€ÿÿ
  403. ‚€ÿÿ
  404. À
  405. B€ÿÿ
  406. pò€ÿÿ ¢€ÿÿ‹R€ÿÿ•€ÿÿ∞°€ÿÿ3`€ÿÿã€ÿÿ
  407. À€ÿÿ
  408. C
  409. p€ÿÿó €ÿÿ£‹€ÿÿS•€ÿÿ0€    ÿÿ6ÿÿ*b¯DSET≠ÿÿ.H-ü<\ÿÿÿÿÿÿ}™T?•I-€ÿÿ°
  410. ÿÿ*?•I€-    ›€-
  411. Ü€- †€- †€-
  412. †€-†€-†€-6€-†DSETT@}{€Ü}~À}™(}z €-}{≥, iii}i$"    àm"    àp"    àm r[ˇP[¥ΔWWl≤[¡‰
  413. ~{ۯ~
  414.  
  415. Technote 1075          ///            Release 1.0         © 1996         ///                ///          Page    of    9
  416. FNTMCUTSDSUM1Frederique Courard HauriHDNISTYLëÿÿ@STYL{¥}z˛}~<}}¸}}´}™√}~´}™h}™ΔìvÿÿM
  417. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  418. ÿÿÿÿÍ
  419. ÿÿÿÿ
  420. ÿÿÿÿ
  421. ÿÿÿÿÿÿÿÿÿÿ    ÿÿÿÿ        ÿÿÿÿÿÿ
  422.     ÿÿÿÿÿÿ kÿÿ 
  423. ÿÿÿÿ
  424. ÿÿÿÿH
  425. ÿÿÿÿ
  426. ÿÿ    ÿÿÿÿ
  427. ÿÿÿÿ ÿÿÿÿÿÿÿÿ%‹ÿÿÿÿÿÿ0ÿÿÿÿ0ÿÿÿÿ0ÿÿÿÿ0ÿÿÿÿ0ÿÿÿÿ0    ÿÿÿÿ0
  428. ÿÿÿÿ0 ÿÿÿÿ0 ÿÿÿÿ 0
  429. ÿÿÿÿ!0ÿÿÿÿ"0ÿÿÿÿ$0ÿÿÿÿ% %‹ÿÿÿÿÿÿ!&0%%ÿÿ"'0%%ÿÿ#(0%%ÿÿÿÿ$)0%'ÿÿ%*0%'ÿÿ&,0%'    ÿÿ'-0%'
  430. ÿÿ(.0%' ÿÿ)/0%' ÿÿÿÿ*10%&ÿÿÿÿ+20%&ÿÿÿÿ,30%(ÿÿ-50%(ÿÿÿÿ%.6‹ÿÿÿÿÿÿ/7066 ÿÿÿÿ08066!ÿÿÿÿ19066!ÿÿÿÿ2:068"ÿÿÿÿ3<068#ÿÿÿÿ4=068#    ÿÿÿÿ5>068#
  431. ÿÿÿÿ6?068# ÿÿÿÿ7@068# ÿÿÿÿ8A067$ÿÿÿÿ9B067$ÿÿÿÿ:C069"ÿÿÿÿ;D069#ÿÿÿÿ%<E‹ÿÿÿÿÿÿ=F0EE%ÿÿÿÿ>G0EEÿÿÿÿ?H0EEÿÿÿÿ@I0EG&    ÿÿÿÿAK0EGÿÿÿÿBL0EG     ÿÿÿÿCM0EG!    ÿÿÿÿDN0EG"    ÿÿÿÿEO0EG#    ÿÿÿÿFP0EF'$
  432. ÿÿÿÿGQ0EF'%
  433. ÿÿÿÿHR0EH&    ÿÿÿÿIS0EH'ÿÿÿÿ%JT‹ÿÿÿÿ(ÿÿKU0TT()ÿÿÿÿLV0TT*ÿÿÿÿMW0TT+ ÿÿÿÿNX0TV,ÿÿÿÿOY0TV-ÿÿÿÿPZ0TV.ÿÿÿÿQ[0TV/ÿÿÿÿR\0TV0ÿÿÿÿS]0TV1ÿÿÿÿT^0TU)6
  434. ÿÿÿÿU_0TU)7
  435. ÿÿÿÿV…0TW4
  436. ÿÿÿÿW—0TW5
  437. ÿÿÿÿX‘‹ÿÿÿÿ(ÿÿYŸ0‘‘) ÿÿLZ⁄0‘‘*ÿÿÿÿ[∂0‘‘2ÿÿÿÿ\Δ0‘⁄,ÿÿÿÿ]Œ0‘⁄3ÿÿÿÿ^‚0‘⁄8ÿÿÿÿ_„0‘⁄9ÿÿÿÿ`‰0‘⁄:ÿÿÿÿa0‘Ÿ*6
  438. ÿÿÿÿbˆ0‘∂<ÿÿÿÿc˜‹ÿÿÿÿ;ÿÿd˘0˜˜+=ÿÿÿÿe˙0˜˜>ÿÿÿÿf˚0˜˙ ÿÿÿÿg˝0˜˙!ÿÿÿÿh˛0˜˙"ÿÿÿÿiˇ0˜˙#ÿÿÿÿjı0˜˘1Aÿÿÿÿkƒ0˜˘1Bÿÿÿÿl Øÿÿÿÿ    ÿÿm¡8   ÿÿÿÿn¢8   ÿÿÿÿo£8  ÿÿÿÿp€8  ÿÿÿÿq¥8  ÿÿÿÿrœ8  ÿÿÿÿs§8  ÿÿÿÿt¨8  ÿÿÿÿu©8  ÿÿÿÿvª8  ÿÿÿÿw«8  ÿÿÿÿx¬8  %ÿÿÿÿy–Øÿÿÿÿ3&ÿÿz®8––4'ÿÿÿÿ{¯8––8(ÿÿÿÿ|°8––C)ÿÿÿÿ}±8––M*ÿÿÿÿ~”8––M+ÿÿÿÿ“8––M,ÿÿÿÿ•´8––M-ÿÿÿÿ™µ8––M.ÿÿÿÿ≠¶8––M/ÿÿÿÿ∞·8––M0ÿÿÿÿ ≥¸Øÿÿÿÿ1ÿÿ∑’8¸¸2ÿÿÿÿ∫º8¸¸3ÿÿÿÿΩ»8¸¸4ÿÿÿÿ√π8¸¸5ÿÿÿÿ≈∏8¸¸6ÿÿÿÿ…i    ÿÿ5ÿÿÿÿ—mÿÿi7ÿÿ—‘pÿÿi7ÿÿÿÿŸ}    ÿÿÿÿÿÿ⁄≠    ÿÿÿÿÿÿ∂√    ÿÿÿÿÿÿ Δ¿    ÿÿ ÿÿÿÿŒÅ    ÿÿ!ÿÿ⁄L‚É    ÿÿÿÿÿÿ„nÿÿ≠ÿÿÿÿ‰qÿÿ≠
  439. ÿÿÿÿrÿÿ√
  440. 8ÿÿÿÿˆwÿÿÅ    @ÿÿÿÿ˜{ÿÿÅ
  441. @ÿÿ‰˘≥ÿÿÉ
  442. ÿÿÿÿ˙0ÿÿ¿=ÿÿÿÿ˚+
  443. ¿ ÿÿÿÿ˝;ÿÿ;
  444. ÿÿÿÿ˛`ÿÿ}<7ÿÿÿÿˇgÿÿÿÿı ÿÿ2 ÿÿƒÿÿ9
  445. ÿÿ aÿÿ:ÿÿ¡hÿÿ0ÿÿ¢dÿÿÿÿ£uÿÿÿÿ€vÿÿ    ¥    gÿÿÿÿœJÿÿ
  446. ÿÿÿÿ§~ÿÿ,
  447. ÿÿ+¨    ÿÿBÿÿÿÿ    ©4
  448. 
  449. ÿÿÿÿªo    ÿÿDÿÿÿÿ«zÿÿo
  450. ÿÿÿÿ¬xÿÿ
  451.  ÿÿ–∑ÿÿ}
  452. 7ÿÿÿÿ®bvo-ÿÿÿÿ¯™a≠6ÿÿÿÿ    °sÿÿÉ=ÿÿ©±•
  453. É
  454. ÿÿÿÿ”tÿÿ>ÿÿÿÿ“yÿÿ
  455. ÿÿÿÿ´e    ÿÿÿÿÿÿµÀ É9ÿÿÿÿ¶È ÿÿÿÿ ·Ã    ÿÿ9ÿÿ¶¸Ä Ãÿÿ±’Ì
  456. Ã
  457. ÿÿÿÿºÑÿÿÃ
  458. :ÿÿÿÿ»Ç Ã?ÿÿ’πÓ
  459. e
  460. ÿÿÿÿ∏≈    ÿÿÿÿÿÿ≤Íÿÿ≈>;ÿÿÿÿ¿Òÿÿ≈
  461. ;ÿÿ¸ÀÕ ≈ÿÿÿÿÁÙÿÿÃ:ÿÿ»Â≤ É?ÿÿ®Ë-ÿÿÿÿÄ∫    ÿÿÿÿ≤ÅËÿÿ∫>;ÿÿ¿ÆÎÿÿ∫
  462. ;ÿÿÀÇÏ ∫ÿÿÿÿ@Èf    ÿÿ<ÿÿÿÿÉÔ fBÿÿÿÿ ÊÜ    ÿÿ?ÿÿɈ ÜBÿÿÿÿ
  463. Ì∞    ÿÿ#ÿÿËÍÁ ∞BÿÿÿÿΠ   ÿÿ$ÿÿÿÿÏfi
  464. ÂDÿÿÍ‹l ÂBÿÿÿÿ'ÑÊ    ÿÿAÿÿ‹Ò ÊBÿÿÿÿ)ÓØ    ÿÿEÿÿÒÔß ØBÿÿÿÿÕà    ÿÿFÿÿÔÖá àBÿÿÿÿ◊â
  465. Ê/ÿÿÂØÆ Ê?ÿÿÿÿÙåÿÿÂ
  466. GÿÿÿÿÚçÿÿÊHÿÿÿÿÛÖÿÿÊ@HÿÿÿÿÜæÿÿØEIÿÿÿÿ†ÛÿÿÉGÿÿÿÿfiãÿÿÉHÿÿÿÿßä ÉIÿÿÿÿàè ØJÿÿÿÿáé    ÿÿJÿÿ˚âê
  467. é ÿÿÿÿãë    Kÿÿÿÿäìÿÿë
  468. Lÿÿÿÿåö    Nÿÿπæø
  469. ö
  470. ÿÿÿÿçjÿÿö=Lÿÿ¥èódöÿÿœé÷dö
  471. ÿÿÿÿêôÿÿöLÿÿÀÈÿÿHASH‘
  472. $Ú @J£ àùô◊‘JôؑXÑÛÔ ÑÛÔ.á´fiãã%8◊cãµÕá<é?5¡êä ëå&
  473. 
  474. Ã æ&Ç&µ&
  475. è& éøâ    &Ø
  476. 
  477. Ï%&ß%&à%&Ö&    ◊K&çK&
  478. êK& äS&ãS&
  479. å˚, Á˚,º¨,Ú©,Ù®,
  480. °®,˘®, „®,Δ†¯
  481. ¯¯fiÄ,ÜÅ,Ûöb ÷A!˝û, ´, ·, á,Õ    ,È    ,Ê,Ó,Ì,Ñ,Î, ‚_b
  482. ,∑Q∫vΩ˝√À≈,mQnvo˝p€.˙®&Àqår. Δ
  483. s& ∂/tTuyvıwÃx,8zQI{v4|˝5}À5~å5    
  484. 5•    /5™    T5≠    y5∞"%&'()-0OFPGCUø* +    04    15    26    37CaJTKU    (0
  485. G,    5$y·:y˝8Ù?9Ù    H;ùù#ùB2ù    $1ù    33‡J=‡>‡ EKÿ>Y/ï!e-B.C/D0EFH`@/P0Q1R2S0WJV&A.I
  486. ">
  487. #?
  488. $Z
  489. %[hifg*j…”kûHb‡/O‡9_‡:`‡1\‡7]‡8^‡DNfl0d'MA& …A
  490. 7‘H∞¶·€L: QUNù¢f&–f ˛fw& Ÿf¸egyh“çmh’ÑÚj–◊alq”º
  491. n°çtƒnØ¥¸¬o.ñêÆo.ñ‡Åo6ñçˆo6ñê˜oFñê«onñê“onñ‡”pñç∏pñèÄp#ñèŒp3ñèªp[ñè¨q’itır”◊as§é˜ˇt“◊Å≥yœ◊◊ z«áoz¶ÕÄ{«á∂§}Bod}©ÓÖl.N.
  492. CHAR}{@ÿÿÿÿÿ ÿÿ ÿÿÿú    ÿÿÿfl ÿÿ ÿÿÿû
  493. ÿÿ•ÿÿÿéÿÿ"ÿ† ÿÿÿÿÿÿàÿÿÓÿÿÿÿÿÿÿÿ
  494. ÿÿÿÿ    ÿÿÿÿÿÿ ÿóàÿÿÿúÿÿ
  495. ÿòÓ'ÿØ
  496. ÿÿÿ÷ àÿÿÿÿ
  497. ÿÿ"
  498. (
  499. '
  500. ÿÿ%
  501. ÿÿ
  502. ÿÿ     
  503.     ÿÿ
  504.     ÿÿ
  505.     ÿÿ.    ÿÿ
  506.     ÿÿ
  507. !
  508. 
  509.      /    ÿÿ*
  510. 2
  511. %/
  512. ÿÿ        (        
  513. ÿÿÿÿ.÷Ñ"    àÿÿ àAÿÿÿÿflÿ•Óÿÿÿû
  514. à9ÿè    +ÿÿ
  515. ÿòàÿÿ&    ÿÿ&ÿÿ :ÿÿ
  516. àÿÿÿÿ"    àÿÿ  ÿÿÿú
  517. ÿÿ
  518. ÿò
  519. àÿÿ ÿÿàÿÿ ÿÿà0ÿû
  520. ÿÿÿÿ
  521. ÿÿÿú    ÿÿÿfl
  522. Fÿÿÿÿÿÿ
  523. ÿÿÿû
  524. ÿÿ&
  525. ÿÿÿÿàÿÿÿÿ
  526. Kÿÿÿÿ ÿó
  527. òÿÿflÿ•
  528. ÿÿ ÿ÷
  529. òÿÿÿÿÿû    Lÿÿÿÿÿÿ
  530. ÿÿÿÿÿÿÿÿ    3&    B3ÿÿHASH10C1M44E8≥"*3:$;'D&)*"    #    ))    *     
  531. 5à -à
  532. à*,è87    =
  533.      
  534.   >∂GÓ à    6à2à<à ;ò
  535. H?àD!I!J!    B!
  536. @!E!à
  537. /RC?
  538. CELL}~Xÿÿÿÿÿpÿÿÿ ÿÿÿÿü
  539. ÿÿÿÿø
  540. ÿÿøÿÿÿÿÿÿÿÿÿÿ    ÿÿü
  541. ÿÿü
  542. ÿÿø
  543. ÿÿø
  544. ÿÿü
  545. ÿÿÿÿü
  546. ÿÿü
  547. ÿÿøÿÿøøÿÿÿÿÿÿÿÿx≥
  548. ÿÿØ$ ÿÿx• ÿÿØ 
  549. ÿÿÿÿÿÿÿÿÿÿ    ÿÿø
  550. ÿÿø ÿÿ ÿÿ
  551. ÿÿÿÿøÿÿÿÿûÿÿøÿÿøÿÿÿÿÿÿÿÿ    ÿÿÿÿøÿÿÿ ÿÿÿ
  552. ÿÿü
  553. ÿÿü ÿÿøÿÿøÿÿø    ÿÿÿÿø ÿÿø
  554. ÿÿ@ÿÿÿÿø
  555. ÿÿÿÿÿÿø ÿÿ(Ó
  556. ÿÿ√s Δ@ÿÿHASHÿ    
  557.       
  558. $ %
  559. 67(xŸx∂Ø1Ø3øøø    ø
  560. ø
  561. )ü ü >     
  562. ! " #&'
  563. ./01
  564. 45;*2*èA…‘Bú=ú
  565. -ú,ú<ú3ú8ú9ú:‡    + Æÿÿ
  566. GRPH}}‘ÿÿÿÿÿpÿÿÿ@ÿÿÎÿÿ
  567. ÿÿÎÿÿ
  568. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ|ÿÿHASH
  569.     Ò
  570. Î   !jO"l
  571. RULR}™Pÿÿÿÿÿÿ/ÿÿÿ‡@ÿÿ\ÿÿÂBdÿÿÿ˚ÿôNN.
  572. ⁄
  573. °=
  574. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿbBÿÿ     $ÿÿÿ@ÿÿÿÿ@ÿÿ$ÿÿHÿÿÿªB<ÿÿíÿZÿôNN.
  575. ⁄
  576. °=
  577. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿlÿÿÿbBÿÿΔÿÿ´ÿÿiÿÂBdÿÿØÿÿíflZÿôNN.
  578. ⁄
  579. °=
  580. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿiÿbBÿÿüÿÿiflR6ÿÿ ÿÿDÿÿ    hÿÿ
  581. ‘ÿÿÿrÿôNN.
  582. ⁄
  583. °=
  584. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿiÿbBÿÿiÿªB<ÿÿaÿ˚ÿÿíÿbÿôNN.
  585. ⁄
  586. °=
  587. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇ>ÿÿÿÿifljBÿÿiöZDÿÿi÷ZEÿÿ °ÿÿÿÿ$ÿÿHÿÿlÿÿΔÿÿ´ÿÿØÿÿüÿÿ ÿÿDÿÿ    hÿÿÿÿ$ÿÿHÿÿlÿÿΔÿÿ´ÿÿÿÂBdÿÿÿbBÿÿiÿZ6ÿÿÿZ6ÿÿÿZÿôNN.
  588. ⁄
  589. °=
  590. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿiöRDÿÿÿ˚CÿÿÿÿÿjBÿÿi÷RDÿÿÿbÿôNN.
  591. ⁄
  592. °=
  593. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿi÷ZDÿÿíÿ˚ÿôNN.
  594. ⁄
  595. °=
  596. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇMÿÿÿÿiÿ…BÿÿíÿrÿôNN.
  597. ⁄
  598. °=
  599. HøÇ.R˘\æ*™Ç≥PÇ„6f„1ÌÇ.R„1NÇ0ÜÇÿÿi÷ZCÿÿiöRCÿÿÿZEÿÿÿZDÿÿÿZCÿÿafl˚ÿÿ÷CÿÿÿCÿÿÿÿÿÿÿ…BÿÿÿCÒKÿÿHASHÿCÿLK÷KKÿN‚:ƒI H¡Gœœî>
  600. óû9‡JøFø<ù?ùE    ø#    ùA
  601. ù$W>ÿ1,2Q3v4˝5À6    ˛
  602. =œ8‡
  603.  , Q v˝Àå&
  604. /TyıÃ%,'Q(v)˝*À+å,    
  605. -    /.    T/    y0
  606. 0@
  607. @ÿ@‡ee7eon&͆;n.͆@n>͆nf͆oÍÜo͆o͆!o+͆DoS͆BùLKUP     ı
  608. #¥ƒ¨
  609. c !"#$%˚&'()˙*+,©-./012˝3456789:;<=>?@œABCDEFGHIJKLMNOPQRSTU˛ ®|¢´Èˇ¡…ç ‹—„ª‘‰°”£€ˆ¬“«˜ΩŸ§Ò±¯⁄Ì˘–Ä◊∂∏VWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~•™≠∞≥∑∫Ω√≈ÂΔµÍη¸ŒØ»¶‚ÑÅ’≤ÆÇú¿πÉÀÛÚÓÁí†ÊËÏÔÕÖ◊fißÙÜÚàáâãäîï›ñòõèêÿÿåéæ´!ÿÿ$NAMEDefault
  610. Default SSHeaderBodyFooterFootnoteFootnote Index
  611. HeadingH2.H2 Code.CV
  612. Heading1.H1Italic HeadingH3.H3 TitleAuthorNumberClassic% Blue Gray 16 Blue Gray 2EColorfulT
  613. 3D Table 1‘
  614. 3D Table 2˜
  615. Accounting Harvard–Legal¸DiamondgBullet+aAddressh Affiliationd Bullet itemsu Further RefvAcknowledgments~Footer xFurther ReferenceTÿÿ"APPSBullet´    Checklist´Δ DFNTM    HelveticaGenevaPalatinoMonacoCourierChicago    
  616.   
  617. GenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaÿÿGeneva:H
  618. Letter GothicETBL@FNTMM.CUTSM6DSUMM>HDNIMwSTYLM™ETBL¯ïÿfl‡üûúùø›ñòóôõö÷